# #3.设计一个图书馆管理系统，包含以下类：
#
# Book：表示一本书，包含属性 title、author、isbn 和 available。
# Member：表示图书馆会员，包含属性 name 和 member_id，以及方法 borrow_book 和 return_book。
# Library：表示图书馆，包含属性 books（一个包含所有书籍的列表）和 members（一个包含所有会员的列表），以及方法 add_book、add_member、remove_book 和 remove_member。
# Librarian：表示图书管理员，继承自 Member，并包含额外的方法 add_book_to_library 和 remove_book_from_library。
# 要求
# Book 类应该有一个方法 is_available，用于检查书籍是否可借。
# Member 类的 borrow_book 方法应该检查书籍是否可借，如果可借则将书籍标记为不可借，并将书籍添加到会员的借书列表中。
# Member 类的 return_book 方法应该将书籍标记为可借，并从会员的借书列表中移除。
# Library 类应该有一个方法 get_available_books，用于获取所有可借的书籍。
# Librarian 类
# 应该能够添加和移除书籍，并且只有图书管理员才能执行这些操作。
from dataclasses import dataclass


@dataclass
class Book:
    title: str
    author: str
    isbn: str
    available: bool

    def is_available(self):
        return self.available


@dataclass
class Library:
    books: list
    members: list

    def get_available_books(self):
        return [book for book in self.books if book.is_available()]


@dataclass
class Member:
    name: str
    member_id: str

    def borrow_book(self, library, book):
        if book.is_available():
            book.available = False
            library.members.append(book)
        else:
            print("书不可借")

    def return_book(self, library: Library, book: Book):
        book.available = True
        library.members.remove(book)


@dataclass
class Librarian(Member):
    def add_book_to_library(self, library, book):
        library.books.append(book)

    def remove_book_from_library(self, library, book):
        library.books.remove(book)


if __name__ == "__main__":
    book1 = Book("title1", "author1", "isbn1", True)
    book2 = Book("title2", "author2", "isbn2", True)
    book3 = Book("title3", "author3", "isbn3", True)
    member1 = Member("member1", "member_id1")
    member2 = Member("member2", "member_id2")
    library = Library([book1, book2, book3], [member1, member2])
    librarian = Librarian("librarian1", "librarian_id1")
    librarian.add_book_to_library(library, book1)
    librarian.add_book_to_library(library, book2)
    librarian.add_book_to_library(library, book3)
    print(library.get_available_books())
    librarian.borrow_book(library, book1)
    librarian.borrow_book(library, book2)
    librarian.borrow_book(library, book3)
    librarian.return_book(library, book1)
    librarian.return_book(library, book2)
    librarian.return_book(library, book3)
